package gew.services;

import gew.data.LoadRequest;
import javax.ejb.EJB;
import javax.ejb.Singleton;

@Singleton
public class TradeLoadExecutionService {

    private final static String LOCAL_FOLDER_TEMP = "/home/gew/data/";
    private final static String URL_BASIC = "http://comtrade.un.org";
    private final static String LOCAL_FOLDER_ARCHIVE = "/home/gew/data-archive/";
    private final static int BUFFER_SIZE = 4096;
    private final static String ARCHIVE_FILE_EXTENSION = ".7z";
    private final static String INPUT_FILE_EXTENSION = ".txt";
    private final static Integer CMD_TIMEOUT = 60000;
    private final static Integer CMD_STEP = 500;

    @EJB
    private QueryService queryService;

    public Long getMilliSeconds() {
        return System.currentTimeMillis();
    }
    
    public Boolean executeRequest(){
        System.out.println("::::::: Start Trade Load From Web Service :::::::");
        Boolean result;
        
        // Получить следующий LoadRequest
        LoadRequest loadRequest = TradeImportData.getNextLoadRequest(queryService, LoadRequest.STATUS_READY);
        result = loadRequest != null;
        if (!result) {
            System.out.println("::::::: EXIT: LoadRequest not found :::::::");
            return result;
        }
        
        // Установить статус LoadRequest в обработке
        result = TradeImportData.updateLoadRequestStatus(queryService, loadRequest.getLoadRequestId(), LoadRequest.STATUS_EXECUTION);
        if (!result) {
            System.out.println("::::::: EXIT: Error on updating LoadRequest status :::::::");
            return result;
        }
        
        // Проверить доступность URL
        result = TradeImportData.checkUrlAvailability(URL_BASIC);
        if (!result) {
            System.out.println("::::::: EXIT: URL is not reachable :::::::");
            TradeImportData.updateLoadRequestStatus(queryService, loadRequest.getLoadRequestId(), LoadRequest.STATUS_READY);
            return result;
        }
        
        // Загрузить файл с данными на сервер
        result = TradeImportData.loadFileFromUrl(LOCAL_FOLDER_TEMP, loadRequest.getFilename(), loadRequest.getUrl(), BUFFER_SIZE);
        if (!result) {
            System.out.println("::::::: EXIT: Error occured during loading file from url :::::::");
            TradeImportData.updateLoadRequestStatus(queryService, loadRequest.getLoadRequestId(), LoadRequest.STATUS_READY);
            return result;
        }
        
        // Импортировать данные в БД
        result = TradeImportData.importFileData2(loadRequest.getFilename(), LOCAL_FOLDER_TEMP, queryService, loadRequest.getLoadRequestId());
        if (!result) {
            System.out.println("::::::: EXIT: Error occured during import data into DB :::::::");
            TradeImportData.updateLoadRequestStatus(queryService, loadRequest.getLoadRequestId(), LoadRequest.STATUS_READY);
            return result;
        }
        
        // Сделать архив в папке архивов
        String archiveFileName = loadRequest.getFilename().replace(INPUT_FILE_EXTENSION, ARCHIVE_FILE_EXTENSION);
        result = TradeImportData.createArchive(loadRequest.getFilename(), LOCAL_FOLDER_TEMP, archiveFileName, LOCAL_FOLDER_ARCHIVE, CMD_TIMEOUT, CMD_STEP);
        if (!result) {
            System.out.println("::::::: EXIT: Error occured during create an archive :::::::");
            TradeImportData.updateLoadRequestStatus(queryService, loadRequest.getLoadRequestId(), LoadRequest.STATUS_READY);
            return result;
        }
        
        // Удалить загруженный файл
        result = TradeImportData.removeFile(loadRequest.getFilename(), LOCAL_FOLDER_TEMP, CMD_TIMEOUT, CMD_STEP);
        if (!result) {
            System.out.println("::::::: EXIT: Error occured during remove input file :::::::");
            TradeImportData.updateLoadRequestStatus(queryService, loadRequest.getLoadRequestId(), LoadRequest.STATUS_READY);
            return result;
        }
        
        // Обновить статус loadRequest на Завершён
        TradeImportData.updateLoadRequestStatus(queryService, loadRequest.getLoadRequestId(), LoadRequest.STATUS_COMPLETED);

        System.out.println(":::::::   End Trade Load Web Service  :::::::");
        
        return result;
    }
}
